package 简单.位运算;

import java.util.ArrayList;
import java.util.List;

/**
 * 给你三个整数数组 nums1、nums2 和 nums3 ，请你构造并返回一个 元素各不相同的 数组，
 * 且由 至少 在 两个 数组中出现的所有值组成。数组中的元素可以按 任意 顺序排列。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/two-out-of-three
 */
public class 至少在两个数组中出现的值_2032 {

    public static void main(String[] args) {

    }

    /**
     * 三个数组记录
     */
    public List<Integer> twoOutOfThree(int[] nums1, int[] nums2, int[] nums3) {
        List<Integer> list = new ArrayList<>();
        boolean[] r1 = new boolean[101];
        boolean[] r2 = new boolean[101];
        boolean[] r3 = new boolean[101];

        for (int num : nums1) {
            r1[num] = true;
        }
        for (int num : nums2) {
            r2[num] = true;
        }
        for (int num : nums3) {
            r3[num] = true;
        }

        for (int num = 1; num <= 100; num++) {
            if (r1[num] && r2[num]) {
                list.add(num);
            } else if (r1[num] && r3[num]) {
                list.add(num);
            } else if (r2[num] && r3[num]) {
                list.add(num);
            }
        }

        return list;
    }

    /**
     * 一个数组+3个bit
     */
    public List<Integer> twoOutOfThree2(int[] nums1, int[] nums2, int[] nums3) {
        List<Integer> list = new ArrayList<>();
        int[] record = new int[101];
        for (int num : nums1) {
            record[num] |= 1;
        }
        for (int num : nums2) {
            record[num] |= 2;
        }
        for (int num : nums3) {
            record[num] |= 4;
        }
        for (int num = 1; num < record.length; num++) {
            if (Integer.bitCount(record[num]) >= 2) {
                list.add(num);
            }
        }

        return list;
    }

}
